package org.fog.tools;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.List;
import java.util.regex.Pattern;

/**
 * User: 缪凯
 * Date: 12-2-20
 * Time: 下午10:11
 */
public class IOKit {
    private IOKit(){}

    public synchronized static IOKit getDefaultIOKit(){
        return new IOKit();
    }

    /**
     * 获取指定路径下的，指定民命规则（正则表达式）的文件队列，当指定规则（正则表达式）为空时则返货该路径下的所有文件
     * @param path  需要超找的指定路径
     * @param regex  文件名规则
     * @return  返回所有文件的列表
     * @throws IOException  当指定路径不存在时抛出IO异常
     */
    public List<File> listFiles(URI path , String regex) throws IOException {
        CopyOnWriteArrayList<File> files = null;
        //TODO 目前只实现当前路径的文件获取，以后再实现包含*情况下的子目录文件发现
        if(path != null){
            File dir = new File(path);
            if(dir.isDirectory()){
                files = new CopyOnWriteArrayList<File>(dir.listFiles(new FileFilterImp(regex)));
            }else
                throw new IOException("[" + path.getPath() + "] 不是一个有效的文件目录");
        }

        return files;
    }


    /**
     * 静态内部类以给定的“正则表达式”对文件名进行验证
     */
    private static class FileFilterImp implements FileFilter {
        private Pattern pattern = null;

        protected FileFilterImp(String regex){
            if(regex != null && !"".equals(regex)){
                this.pattern = Pattern.compile(regex);
            }
        }

        /**
         * Tests whether or not the specified abstract pathname should be
         * included in a pathname list.
         *
         * @param pathname The abstract pathname to be tested
         * @return <code>true</code> if and only if <code>pathname</code>
         *         should be included
         */
        public boolean accept(File pathname) {
            return !pathname.isDirectory() &&
                    (this.pattern == null || pattern.matcher(pathname.getName()).matches());
        }
    }





    public static void main(String[] args){
        try {
            IOKit.getDefaultIOKit().listFiles(new URI("file:///D:/download"), ".*\\.exe");  //匹配所有的
        } catch (IOException e) {
            e.printStackTrace();  //todo  实现日志
        } catch (URISyntaxException e) {
            e.printStackTrace();  //todo  实现日志
        }
    }
}
